home *** CD-ROM | disk | FTP | other *** search
/ Beginning Mac Programming / Beginning Mac Programming.bin / Open Me for REALbasic 3 / REALbasic 3.2 / Example Projects / Techniques / Examples by Thomas Tempelmann / TT's AliasRecord / Plugin Source (CW Pro 3) / Plugin Source.cpp < prev   
Text File  |  1999-07-05  |  6KB  |  218 lines

  1. /*
  2.  * Mac OS Alias Manager Plugin for REALbasic 2
  3.  *
  4.  * This code is freeware, you may use and extend it as you like.
  5.  *
  6.  * The accompanying project file was created using CodeWarrior Pro 3.
  7.  *
  8.  * It was written on June 3, 99 by Thomas Tempelmann.
  9.  *
  10.  * More RB-related stuff can be found here: <http://www.tempel.org/rb/>
  11.  *
  12.  * Enjoy and contribute!
  13.  */
  14.  
  15. #include <string.h>
  16. #include "rb_plugin.h"
  17.  
  18.  
  19. //----------------
  20. // plugin classes
  21. //----------------
  22.  
  23. extern REALclassDefinition MacAliasRecordClass;    // forward declaration
  24.  
  25. struct MacAliasData
  26. {
  27.     // internal class properties
  28.     AliasHandle    hdl;
  29.     Boolean        needsUpdate;
  30. };
  31.  
  32. static void MacAliasConstructor (REALobject instance, void *garbage)
  33. {
  34.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  35.  
  36.     me->needsUpdate = false;
  37.     me->hdl = nil;
  38. }
  39.  
  40. static void MacAliasDestructor (REALobject instance, void *garbage)
  41. {
  42.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  43.  
  44.     if (me->hdl) {
  45.         DisposeHandle ((Handle)me->hdl);
  46.         me->hdl = nil;
  47.     }
  48. }
  49.  
  50. static long createAlias (REALobject instance, REALfolderItem relPath, REALfolderItem target)
  51. {
  52.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  53.  
  54.     if (target == NULL) return paramErr;
  55.  
  56.     if (me->hdl) {
  57.         DisposeHandle ((Handle)me->hdl);
  58.         me->hdl = nil;
  59.     }
  60.     FSSpec sp1, sp2, *p1 = nil;
  61.     if (relPath) {
  62.         REALFSSpecFromFolderItem (&sp1, relPath);
  63.         p1 = &sp1;
  64.     }
  65.     REALFSSpecFromFolderItem (&sp2, target);
  66.     me->needsUpdate = false;
  67.     return NewAlias (p1, &sp2, &me->hdl);
  68. }
  69.  
  70. static long updateAlias (REALobject instance, REALfolderItem relPath, REALfolderItem target)
  71. {
  72.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  73.  
  74.     if (target == NULL) return paramErr;
  75.  
  76.     if (!me->hdl) {
  77.         return paramErr;
  78.     }
  79.     Boolean changed;
  80.     FSSpec sp1, sp2, *p1 = nil;
  81.     if (relPath) {
  82.         REALFSSpecFromFolderItem (&sp1, relPath);
  83.         p1 = &sp1;
  84.     }
  85.     REALFSSpecFromFolderItem (&sp2, target);
  86.     long ret = UpdateAlias (p1, &sp2, me->hdl, &changed);
  87.     if (ret == noErr) {
  88.         me->needsUpdate = false;
  89.         ret = changed;
  90.     }
  91.     return ret;
  92. }
  93.  
  94. static REALstring getAliasInfo (REALobject instance, long index)
  95. {
  96.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  97.     
  98.     Str63 s;
  99.     if (me->hdl && GetAliasInfo (me->hdl, index, s) == noErr) {
  100.         return REALBuildString ((const char*)&s[1], s[0]);
  101.     }
  102.     return nil;
  103. }
  104.  
  105. static REALstring getAliasRec (REALobject instance)
  106. {
  107.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  108.     
  109.     if (me->hdl) {
  110.         return REALBuildString (*(Handle)me->hdl, GetHandleSize((Handle)me->hdl));
  111.     }
  112.     return nil;
  113. }
  114.  
  115. static void setAliasRec (REALobject instance, REALstring str)
  116. {
  117.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  118.     
  119.     long len = str->Length();
  120.     
  121.     if (me->hdl) {
  122.         SetHandleSize ((Handle)me->hdl, len);
  123.     } else {
  124.         me->hdl = (AliasHandle) NewHandle (len);
  125.     }
  126.     if (me->hdl) {
  127.         BlockMoveData (str->CString(), *me->hdl, len);
  128.         me->needsUpdate = false;
  129.     }
  130. }
  131.  
  132. static pascal Boolean filterThisMatch (CInfoPBPtr, Boolean*, Ptr)
  133. {
  134.     return false;
  135. }
  136.  
  137. static REALfolderItem resolveAlias (REALobject instance, REALfolderItem relPath, long mode)
  138. {
  139.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  140.     
  141.     #if TARGET_RT_MAC_CFM
  142.         static RoutineDescriptor filterProc = BUILD_ROUTINE_DESCRIPTOR(uppAliasFilterProcInfo, filterThisMatch);
  143.         #define filterUPP &filterProc
  144.     #else
  145.         #define filterUPP filterThisMatch
  146.     #endif
  147.     
  148.     if (me->hdl) {
  149.         Boolean needsUpdate;
  150.         FSSpec sp1, sp2, *relSpec;
  151.         short n = 1;
  152.         if (relPath) {
  153.             REALFSSpecFromFolderItem (&sp1, relPath);
  154.             relSpec = &sp1;
  155.         } else {
  156.             relSpec = nil;
  157.         }
  158.         OSErr err = MatchAlias (relSpec, mode | kARMSearch, me->hdl, &n, &sp2, &needsUpdate, filterUPP, nil);
  159.         if (n == 1) {
  160.             if (!err) me->needsUpdate = needsUpdate;
  161.             return REALFolderItemFromFSSpec(&sp2);
  162.         }
  163.     }
  164.     return nil;
  165. }
  166.  
  167. static long rtnParam (REALobject instance, long param)
  168. {
  169.     return param;
  170. }
  171.  
  172. static long needsUpdate (REALobject instance, long param)
  173. {
  174.     ClassData (MacAliasRecordClass, instance, MacAliasData, me);
  175.     
  176.     return me->needsUpdate ? 1 : 0;
  177. }
  178.  
  179. static REALproperty MacAliasProperties[] = {
  180.     { nil, "noDialogs", "Integer", 0, (REALproc) rtnParam, nil, 2 },
  181.     { nil, "attemptMount", "Integer", 0, (REALproc) rtnParam, nil, 1 },
  182.     { nil, "allVols", "Integer", 0, (REALproc) rtnParam, nil, 8 },
  183.     { nil, "exhaustive", "Integer", 0, (REALproc) rtnParam, nil, 0x200 },
  184.     { nil, "relFirst", "Integer", 0, (REALproc) rtnParam, nil, 0x400 },
  185.     { nil, "version", "Integer", 0, (REALproc) rtnParam, nil, 0x0101 },
  186.     { nil, "needsUpdate", "Boolean", 0, (REALproc) needsUpdate },
  187. };
  188.  
  189. static REALmethodDefinition MacAliasMethods[] = {
  190.     { (REALproc) createAlias, REALnoImplementation, "Create(relPath as FolderItem, target as FolderItem) as Integer"},
  191.     { (REALproc) updateAlias, REALnoImplementation, "Update(relPath as FolderItem, target as FolderItem) as Integer"},
  192.     { (REALproc) getAliasInfo, REALnoImplementation, "GetInfo(idx as Integer) as String"},
  193.     { (REALproc) getAliasRec, REALnoImplementation, "GetRecord() as String"},
  194.     { (REALproc) setAliasRec, REALnoImplementation, "SetRecord(record as String)"},
  195.     { (REALproc) resolveAlias, REALnoImplementation, "Resolve(relPath as FolderItem, mode as Integer) as FolderItem"},
  196. };
  197.  
  198. static REALclassDefinition MacAliasRecordClass = {
  199.     kCurrentREALControlVersion,
  200.     "MacAliasRecord",
  201.     nil,
  202.     sizeof(MacAliasData),
  203.     0,
  204.     (REALproc) MacAliasConstructor,
  205.     (REALproc) MacAliasDestructor,
  206.     MacAliasProperties,
  207.     sizeof(MacAliasProperties) / sizeof(REALproperty),
  208.     MacAliasMethods,
  209.     sizeof(MacAliasMethods) / sizeof(REALmethodDefinition),
  210.     nil,
  211.     0
  212. };
  213.  
  214. void PluginEntry (void)
  215. {
  216.     REALRegisterClass (&MacAliasRecordClass);
  217. }
  218.